import i18n from "@/lang";
import {
  S_MS,
  MINUTE_MS,
  HOUR_MS,
  DAY_MS,
  MONTH_MS,
  YEAR_MS,
} from "@/constant";
const BASE_Number = {
  s: S_MS, // 一秒的毫秒数
  mm: MINUTE_MS, // 一分钟的毫秒数
  HH: HOUR_MS, // 一小时的毫秒数
  days: DAY_MS, // 一天的毫秒数
  MM: MONTH_MS, // 一个月的毫秒数
  YY: YEAR_MS, // 一年的毫秒数
};

/**
 * 规范化日期 错误返回当前时间
 * @param {string|Date} date
 * @returns {Date}
 */
export function normalizeDate(date) {
  if (!date) {
    return new Date();
  }
  if (!(date instanceof Date)) {
    date = new Date(date);
  }
  if (isNaN(date.getTime())) {
    return new Date();
  }
  return date;
}

/**
 * 国际化日期格式化
 * @param {string|Date} date
 * @param {'short'|'long'} format
 */
export function formatDate(date, format = "short") {
  if (!date) {
    return "";
  }
  date = normalizeDate(date);
  return i18n.global.d(date, format);
}

/**
 * 计算两个日期之间的天数差 正数表示date2在date1之后，负数表示date2在date1之前
 * @param {string|Date} date1 日期1
 * @param {string|Date} date2 日期2，默认为当前时间
 * @param {'days'|'s'|'mm'|'MM'|'HH'|'YY'} returnType 返回格式 day表示天数差，s表示秒数差，mm表示分钟差，MM表示月数差
 * @returns
 */
export function diffDate(date1, date2 = new Date(), returnType = "days") {
  const d1 = normalizeDate(date1);
  const d2 = normalizeDate(date2);
  const diffTime = Math.abs(d2 - d1);
  const result = Math.ceil(diffTime / BASE_Number[returnType]);
  return d2 >= d1 ? result : -1 * result;
}

/**
 * 比较两个日期
 * 返回0表示相等，返回-1表示date1在date2之前，返回1表示date1在date2之后
 * @param {string|Date} date1
 * @param {string|Date} date2
 * @returns {number}
 */
export function compareDate(date1, date2) {
  const d1 = normalizeDate(date1);
  const d2 = normalizeDate(date2);
  if (d1.getTime() === d2.getTime()) {
    return 0; // 相等
  } else if (d1 < d2) {
    return -1; // date1在date2之前
  } else {
    return 1; // date1在date2之后
  }
}
